package com.zp.self.module.level_4_算法练习.数学.数学推理;

/**
 * @author By ZengPeng
 */
public class 力扣_507_完美数 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_507_完美数().checkPerfectNumber(7));
        System.out.println(new 力扣_507_完美数().checkPerfectNumber(28));
        System.out.println(new 力扣_507_完美数().checkPerfectNumber(1));
        System.out.println(new 力扣_507_完美数().checkPerfectNumber(2));
        System.out.println(new 力扣_507_完美数().checkPerfectNumber(3));
    }

    /**
    题目：对于一个 正整数，如果它和除了它自身以外的所有 正因子 之和相等，我们称它为 「完美数」。
     给定一个 整数 n， 如果是完美数，返回 true；否则返回 false。

     示例 1：
     输入：num = 28
     输出：true
     解释：28 = 1 + 2 + 4 + 7 + 14
     1, 2, 4, 7, 和 14 是 28 的所有正因子。

     示例 2：
     输入：num = 7
     输出：false


    分析：【P ♥♥】
       1.直接得到余数为0，累加。
        优化:【从小数开始】得到的商也加上，并判断商与除数的大小，但如果商<除数 :直接剪枝，退出

    边界值 & 注意点：
       1.
     **/
    public boolean checkPerfectNumber(int num) {
        if(num==1) return false;
        int sum=1,factor=2;
        int shang;
        while (factor<num){
            shang  = num / factor;
            if(shang<factor) break;
            if(num%factor==0){
                if(shang==factor)
                    sum+=factor;
                else
                    sum+=(factor+shang);
            }
            factor++;
        }
        return sum==num;
    }
}
